﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;

namespace DataAccess
{
    public class ControllerSupervisor
    {
        #region ATRIBUTOS

        private SqlConnection conexion = DBConnection.getInstancia().getConnection();

        private static ControllerSupervisor unConSuper;

        #endregion
        
        #region SINGLETON

        public static ControllerSupervisor getInstancia()
        {
            if(unConSuper == null)
            {
                unConSuper = new ControllerSupervisor();
            }
            return unConSuper;
        }

        #endregion

        #region CONSTRUCTORES

        private ControllerSupervisor()
        {}

        #endregion

        #region METODOS

        //Alta de nuevo Supervisor.
        public void insertSupervisor(Int32 pNro, string pNom, string pAp, string pTel, string pInt, string pMail, string pSec)
        {
            try
            { 
                //Abrimos la conexion. 
                conexion.Open();
                //Declaramos la transaccion.
                SqlTransaction myTrans = conexion.BeginTransaction(IsolationLevel.Serializable);
                //Creamos el comando.
                SqlCommand myComm = conexion.CreateCommand();
                //Le asignamos la transaccion a la propiedad Transaction del comando creado.
                myComm.Transaction = myTrans;
                try
                {
                    //Insertamos en la tabla "personas".
                    myComm.CommandText = "INSERT INTO personas(pernrofuncionario, pernombre, perapellido, pertelefono, perinterno, permail, perseccion) VALUES (@pNro, @pNom, @pAp, @pTel, @pInt, @pMail, @pSec);";
                    myComm.Parameters.AddWithValue("pNro", pNro);
                    myComm.Parameters.AddWithValue("pNom", truncar(pNom, 29));
                    myComm.Parameters.AddWithValue("pAp", truncar(pAp, 29));
                    myComm.Parameters.AddWithValue("pTel", truncar(pTel, 29));
                    myComm.Parameters.AddWithValue("pInt", truncar(pInt, 19));
                    myComm.Parameters.AddWithValue("pMail", truncar(pMail, 49));
                    myComm.Parameters.AddWithValue("pSec", truncar(pSec, 49));
                    //Ejecutamos el comando.
                    myComm.ExecuteNonQuery();
                    //Insertamos en la tabla "supervisores.
                    myComm.CommandText = "INSERT INTO supervisores(supnrofuncionario) VALUES (@pNroSup);";
                    myComm.Parameters.AddWithValue("pNroSup", pNro);
                    //Ejecutamos el comando.
                    myComm.ExecuteNonQuery();
                    //Hacemos el commit.
                    myTrans.Commit();
                }
                catch(SqlException e)
                {
                    try
                    {
                        //Hacemos el rollback.
                        myTrans.Rollback();

                    }
                    catch(SqlException ex)
                    {
                        throw ex;
                    }
                }

                }
            catch(SqlException ex)
            {
                throw ex;
            }
            finally
            {
                //Cerramos la conexion.
                conexion.Close();
            }
        }
        

        //Dar Supervisor por Nro. de funcionario.
        public DataTable getSupervisorByNro(Int32 pNro)
        {
            return ControllerPersona.getInstancia().getFuncionarioByNro(pNro, "supervisores", "supnrofuncionario");
        }
        
        //Dar Supervisor por Nombre de funcionario.
        public DataTable getSupervisorByName(string pNom, string pAp)
        {
            return ControllerPersona.getInstancia().getFuncionarioByName(pNom, pAp, "supervisores", "supnrofuncionario");
        }
        
        //Dar Supervisor por estado.
        public DataTable getSupervisoresByEstado(bool pEstado)
        {
            return ControllerPersona.getInstancia().getFuncionariosActivos(pEstado, "supnrofuncionario", "supervisores");
        }
        string truncar(string unSt, int maxLength)
        {
            return unSt.Length <= maxLength ? unSt : unSt.Substring(0, maxLength);
        } 
        #endregion
    }
}
